import chalk from 'chalk';
import ora from 'ora';

/**
 * 统一的日志输出工具
 * 提供不同级别的日志输出和 spinner 动画
 */
class Logger {
  constructor(prefix = '') {
    this.prefix = prefix;
  }

  /**
   * 信息日志 - 青色
   */
  info(message) {
    console.log(chalk.cyan(`${this.prefix} ${message}`));
  }

  /**
   * 成功日志 - 绿色带勾
   */
  success(message) {
    console.log(chalk.green(`${this.prefix} ✅ ${message}`));
  }

  /**
   * 警告日志 - 黄色带警告
   */
  warning(message) {
    console.log(chalk.yellow(`${this.prefix} ⚠️  ${message}`));
  }

  /**
   * 错误日志 - 红色带叉
   */
  error(message) {
    console.log(chalk.red(`${this.prefix} ❌ ${message}`));
  }

  /**
   * 创建 spinner 动画
   * @param {string} text - 初始文本
   * @returns {ora.Ora} spinner 实例
   */
  spinnerStart(text) {
    this.spinner = ora({
      text: chalk.cyan(`${this.prefix} ${text} ⏳`),
      color: 'cyan',
    });
    this.spinner.start();
  }
  /**
   * 更新 spinner 文本
   * @param {string} text - 更新后的文本
   */
  spinnerUpdate(text) {
    this.spinner.text = chalk.cyan(`${this.prefix} ${text} ⏳`);
  }

  /**
   * 警告 spinner
   * @param {string} text - 警告后的文本
   */
  spinnerWarn(text) {
    this.spinner.warn(chalk.yellow(`${this.prefix} ${text}`));
  }

  /**
   * 成功 spinner
   * @param {string} text - 成功后的文本
   */
  spinnerSucceed(text) {
    this.spinner.succeed(chalk.green(`${this.prefix} ${text}`));
  }

  /**
   * 失败 spinner
   * @param {string} text - 失败后的文本
   */
  spinnerFail(text) {
    this.spinner.fail(chalk.red(`${this.prefix} ${text}`));
  }

  /**
   * 运行台快了，看不清，加个睡眠
   * @param {number} ms - 睡眠时间
   * @returns {Promise<void>}
   */
  spinnerShamefullySleep(ms = 500) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }

  /**
   * 空行
   */
  blank() {
    console.log();
  }

  /**
   * 标题样式
   */
  title(text) {
    console.log(chalk.bold.cyan(`\n${text}`));
    console.log(chalk.cyan('='.repeat(text.length)));
  }

  /**
   * 列表项
   */
  list(items, indent = 2) {
    items.forEach((item) => {
      console.log(' '.repeat(indent) + chalk.gray('• ') + item);
    });
  }
}

export { Logger };
